﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CroslandSAP.Proxy;
using System.Data;
using CROSLAND.BL.BE;

namespace CROSLAND.DL.DALC.SAPC
{
    public class ReservaDALC : IReservaDALC
    {
        const string nl = "\r\n";

        public static ReservaDALC Instance()
        {
            if (_instance == null)
            {
                lock (typeof(ReservaDALC))
                {
                    if (_instance == null)
                    {
                        _instance = new ReservaDALC();
                    }
                }
            }
            return _instance;
        }

        private ReservaDALC() { }

        private static volatile ReservaDALC _instance = null;


        public DateTime ObtenerFechaFinReserva(DateTime date)
        {
            return DateTime.Now;
        }

        public List<ReservaBE> buscarStock(string pCodMaterial, string pColor, string pCentro, string pAlmacen, string pLote, string pJerarquia, string pGrart, string pAñoFab, string pDisponibilidad)
        {
            ReservasProxy proxy = new ReservasProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }
            RANGE_MATNRTable ranCodMat = new RANGE_MATNRTable();
            RANGE_MATNR lineCodMat = new RANGE_MATNR();
            if (!string.IsNullOrEmpty(pCodMaterial))
            {
                lineCodMat.Sign = "I";
                lineCodMat.Option0 = "EQ";
                lineCodMat.Low = pCodMaterial;
                ranCodMat.Add(lineCodMat);
            }

            ZRANGE_ZZCOLORTable ranColor = new ZRANGE_ZZCOLORTable();
            ZRANGE_ZZCOLOR lineColor = new ZRANGE_ZZCOLOR();
            if (!string.IsNullOrEmpty(pColor))
            {
                lineColor.Sign = "I";
                lineColor.Option0 = "EQ";
                lineColor.Low = pColor;
                ranColor.Add(lineColor);
            }

            RANGE_WERKSTable ranCentro = new RANGE_WERKSTable();
            RANGE_WERKS lineCentro = new RANGE_WERKS();
            if (!string.IsNullOrEmpty(pCentro))
            {
                lineCentro.Sign = "I";
                lineCentro.Option0 = "EQ";
                lineCentro.Low = pCentro;
                ranCentro.Add(lineCentro);
            }

            BAPIDLV_RANGE_LGORTTable ranAlmacen = new BAPIDLV_RANGE_LGORTTable();
            BAPIDLV_RANGE_LGORT lineAlmacen = new BAPIDLV_RANGE_LGORT();
            if (!string.IsNullOrEmpty(pAlmacen))
            {
                lineAlmacen.Sign = "I";
                lineAlmacen.Option0 = "EQ";
                lineAlmacen.Stge_Loc_Low = pAlmacen;
                ranAlmacen.Add(lineAlmacen);
            }

            BAPIDLV_RANGE_CHARGTable ranLote = new BAPIDLV_RANGE_CHARGTable();
            BAPIDLV_RANGE_CHARG lineLote = new BAPIDLV_RANGE_CHARG();
            if (!string.IsNullOrEmpty(pLote))
            {
                lineLote.Sign = "I";
                lineLote.Option0 = "EQ";
                lineLote.Batch_Low = pLote;
                ranLote.Add(lineLote);
            }

            ZRANGE_PRDHATable ranJerarquia = new ZRANGE_PRDHATable();
            ZRANGE_PRDHA lineJerarquia = new ZRANGE_PRDHA();
            if (!string.IsNullOrEmpty(pJerarquia))
            {
                lineJerarquia.Sign = "I";
                lineJerarquia.Option0 = "EQ";
                lineJerarquia.Low = pJerarquia;
                ranJerarquia.Add(lineJerarquia);
            }

            BAPIDLV_RANGE_MATKLTable ranGrpArticulo = new BAPIDLV_RANGE_MATKLTable();
            BAPIDLV_RANGE_MATKL lineGrpArticulo = new BAPIDLV_RANGE_MATKL();
            if (!string.IsNullOrEmpty(pGrart))
            {
                lineGrpArticulo.Sign = "I";
                lineGrpArticulo.Option0 = "EQ";
                lineGrpArticulo.Matl_Group_Low = pGrart;
                ranGrpArticulo.Add(lineGrpArticulo);
            }

            ZRANGE_ZZANOFABTable ranAñoFab = new ZRANGE_ZZANOFABTable();
            ZRANGE_ZZANOFAB lineAñoFab = new ZRANGE_ZZANOFAB();
            if (!string.IsNullOrEmpty(pAñoFab))
            {
                lineAñoFab.Sign = "I";
                lineAñoFab.Option0 = "EQ";
                lineAñoFab.Low = pAñoFab;
                ranAñoFab.Add(lineAñoFab);
            }

            ZRANGE_AVAILTable ranDisponibilidad = new ZRANGE_AVAILTable();
            ZRANGE_AVAIL lineDisponibilidad = new ZRANGE_AVAIL();
            if (!string.IsNullOrEmpty(pDisponibilidad))
            {
                lineDisponibilidad.Sign = "I";
                lineDisponibilidad.Option0 = "EQ";
                lineDisponibilidad.Low = pDisponibilidad;
                ranDisponibilidad.Add(lineDisponibilidad);
            }

            ZSVMS_STOCKTable tblStock = new ZSVMS_STOCKTable();

            proxy.Zvms_Get_Stock(ref ranAñoFab, ref ranDisponibilidad, ref ranLote, ref ranColor, ref ranJerarquia, ref ranAlmacen, ref ranGrpArticulo, ref ranCodMat, ref ranCentro, ref tblStock);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            /* Manejando el retorno */
            DataTable dt = tblStock.ToADODataTable();

            List<ReservaBE> lsReserva = new List<ReservaBE>();
            foreach (DataRow dr in dt.Rows)
            {
                ReservaBE objReserva = new ReservaBE();
                objReserva.codMaterial = dr["ZMATERIAL"].ToString();
                objReserva.descMaterial = dr["ZDESC_MATERIAL"].ToString();
                objReserva.lote = dr["ZLOTE"].ToString();
                objReserva.añoFab = dr["ZANO_FAB"].ToString();
                objReserva.añoModelo = Convert.ToDecimal(dr["ZANO_MODELO"].ToString());
                objReserva.campaña = dr["ZCAMPANA"].ToString();
                objReserva.color = dr["ZCOLOR"].ToString();
                objReserva.descColor = dr["ZDESC_COLOR"].ToString();
                objReserva.descCentro = dr["ZDESC_CENTRO"].ToString();
                objReserva.descAlmacen = dr["ZDESC_ALMACEN"].ToString();
                objReserva.cantidad = Convert.ToDecimal(dr["ZCANTIDAD"].ToString());
                objReserva.disponibilidad = dr["ZDISPONIBILIDAD"].ToString();
                objReserva.descCliente = dr["ZDESC_SOLIC"].ToString();
                objReserva.fecVencimiento = ParametroDALC.dateSapToNet(dr["ZFEC_VENC"].ToString());
                objReserva.emplazamiento = dr["ZEMPLAZAMIENTO"].ToString();
                objReserva.fecNacionalizacion = ParametroDALC.dateSapToNet(dr["ZFEC_NAC_REAL"].ToString());
                objReserva.status = dr["ZSTATUS"].ToString();
                objReserva.chasis = dr["ZCHASIS"].ToString();
                objReserva.motor = dr["ZMOTOR"].ToString();
                objReserva.caja = Convert.ToDecimal(dr["ZCAJA"].ToString());
                objReserva.pedidoImportacion = dr["ZPEDIDOIMP"].ToString();
                objReserva.marca = dr["ZMARCA"].ToString();
                objReserva.modelo = dr["ZMODELO"].ToString();
                objReserva.grupoArticulo = dr["ZGRUPO_ARTICULO"].ToString();

                lsReserva.Add(objReserva);
            }
            return lsReserva;
        }

        public string GenerarReserva(DateTime fechaInicio, DateTime fechaFin, string orgVtas,
           string canal, string codCliente, string oficina, string nroLote)
        {
            ReservasProxy proxy = new ReservasProxy();
            proxy.Connection = DALC.getConnection;
            if (!proxy.Connection.IsOpen) { proxy.Connection.Open(); }


            string pFechaInicio = dateNetToSap(fechaInicio);
            string pFechaFin = dateNetToSap(fechaFin);

            string result = "";

            proxy.Zvmc_Sd_017(canal, codCliente, pFechaInicio, pFechaFin, nroLote, orgVtas, oficina, out result);
            SAP.Connector.SAPConnectionPool.ReturnConnection(proxy.Connection);
            proxy.Connection = null;
            return result;
        }


        public static string dateNetToSap(DateTime pFechaNET)
        {
            try
            {
                return pFechaNET.Year.ToString().PadLeft(4, '0') + pFechaNET.Month.ToString().PadLeft(2, '0') + pFechaNET.Day.ToString().PadLeft(2, '0');
            }
            catch { return string.Empty; }
        }


    }
}